#ifndef APPLICATIONS_CRC_H_
#define APPLICATIONS_CRC_H_

#include <stdio.h>

typedef unsigned char        u8;
typedef unsigned short       u16;
typedef unsigned int         u32;
typedef unsigned long long   u64;

typedef unsigned char        BOOL;
#define FALSE                0
#define TRUE                 1

typedef struct
{
    u8 poly;//多项式
    u8 InitValue;//初始值
    u8 xors;//结果异或值
    BOOL InputReverse;
    BOOL OutputReverse;
}CRC_8;

typedef struct
{
    u16 poly;//多项式
    u16 InitValue;//初始值
    u16 xors;//结果异或值
    BOOL InputReverse;
    BOOL OutputReverse;
}CRC_16;

typedef struct
{
    u32 poly;//多项式
    u32 InitValue;//初始值
    u32 xors;//结果异或值
    BOOL InputReverse;
    BOOL OutputReverse;
}CRC_32;

extern const CRC_8 crc_8;
extern const CRC_8 crc_8_ITU;
extern const CRC_8 crc_8_ROHC;
extern const CRC_8 crc_8_MAXIM;

extern const CRC_16 crc_16_IBM;
extern const CRC_16 crc_16_MAXIM;
extern const CRC_16 crc_16_USB;
extern const CRC_16 crc_16_MODBUS;
extern const CRC_16 crc_16_CCITT;
extern const CRC_16 crc_16_CCITT_FALSE;
extern const CRC_16 crc_16_X5;
extern const CRC_16 crc_16_XMODEM;
extern const CRC_16 crc_16_DNP;

extern const CRC_32 crc_32;
extern const CRC_32 crc_32_MPEG2;

u8 crc8(u8 *addr, int num,CRC_8 type) ;
u16 crc16(u8 *addr, int num,CRC_16 type) ;
u32 crc32(u8 *addr, int num,CRC_32 type) ;

#endif /* APPLICATIONS_CRC_H_ */
